package br.com.velp.sudecap.webservice;

import br.com.velp.sudecap.dto.UsuarioResultadoConsultaDTO;
import br.com.velp.sudecap.entidade.DireitoSistema;
import br.com.velp.sudecap.entidade.Usuario;
import br.com.velp.sudecap.service.UsuarioService;
import br.com.velp.sudecap.util.CriptografiaUtil;
import java.util.List;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * <sumario> 
 * <objetivo> "Rastreabilidade" </objetivo> 
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor> 
 * <versao>1.0.0.0</versao> 
 * <data_criacao> 13.12.2013 </data_criacao> 
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF001.01 - Autenticar Usuário </requisitos_afetados>
 * <descricao> WebService Responsável Pelas Operações Inerentes
 *             Ao Contexto de Usuários 
 * </descricao> 
 * </sumario>
 */
@WebService(serviceName = "WSLogin")
public class WSLogin {

    private UsuarioService usuarioService;

    @Resource
    private WebServiceContext context;

    /**
     * 
     * Método Responsável Por Recuperar Usuários de Acordo 
     * Com o Login e Senha Informados.
     * 
     * @param String login
     * @param String senha
     * 
     * @return UsuarioResultadoConsultaDTO usuario 
     * 
     */
    @WebMethod(operationName = "recuperarUsuarioPorLoginSenha")
    public UsuarioResultadoConsultaDTO recuperarUsuarioPorLoginSenha(@WebParam(name = "login") String login, @WebParam(name = "senha") String senha) {
        
        inicializarServicos();
        
        return this.usuarioService.recuperarUsuarioDTOPorLoginSenha(login, senha);
        
    }
    
    /**
     * 
     * Método Responsável Por Carregar a Lista de Privilégios do 
     * Usuário, de Acordo Com o Sistema Informado.
     * 
     * @param Long idUsuario
     * @param String sistema
     * 
     * @return List<DireitoSistema> direitosSistema
     * 
     */
    @WebMethod(operationName = "recuperarPrivilegiosDoUsuario")
    public List<DireitoSistema> recuperarPrivilegiosDoUsuario(@WebParam(name = "idUsuario") Long idUsuario, @WebParam(name = "sistema") String sistema) {
        
        inicializarServicos();
        
        return this.usuarioService.recuperarPrivilegiosUsuario(new Usuario(idUsuario), sistema);
        
    }
    
    /**
     * 
     * Método Responsável Pela Alteração da Senha do Usuário
     * 
     * @param Long idUsuario
     * @param String novaSenha 
     * 
     */
    @WebMethod(operationName = "alterarSenhaUsuario")
    public void alterarSenhaUsuario(@WebParam(name = "idUsuario") Long idUsuario, @WebParam(name = "novaSenha") String novaSenha) {
        
        inicializarServicos();
        
        Usuario usuario = this.usuarioService.obterPorId(idUsuario);
        usuario.setSenha(CriptografiaUtil.criptografar(CriptografiaUtil.ALGORITMO.MD5, novaSenha));
        
        try {
            this.usuarioService.atualizar(usuario);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

    /**
     * Método Responsável Por Inicializar os 
     * Serviços Utilizados Na Manipulação 
     * dos Registros
     */
    private void inicializarServicos() {

        if (this.usuarioService == null) {
            this.usuarioService = (UsuarioService) getApplicationContext().getBean("usuarioService");
        }

    }
    
    /**
     * 
     * Método Responsável Por Carregar o Arquivo de 
     * Configurações do Spring, Para Acesso Aos 
     * Beans Presentes No Servlet Container 
     * 
     * @return ApplicationContext applicationContext
     * 
     */
    private ApplicationContext getApplicationContext() {
        
        ServletContext servletContext = (ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        
        return context;
        
    }

}
